package com.timeriver.feature_project

import org.apache.spark.ml.feature.ElementwiseProduct
import org.apache.spark.ml.linalg
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
  * ElementwiseProduct用一个提供的 "权重 "向量乘以每个输入向量，使用元素相乘法。
  * 换句话说，它将数据集的每一列按标度乘法进行缩放。
  * Seq 和 Array 的区别是什么？
  */
object ElementwiseProductDemo {
  def main(args: Array[String]): Unit = {
    val session: SparkSession = SparkSession.builder()
      .master("local[6]")
      .appName("基于权重向量对模型训练向量特征的比例缩放")
      .getOrCreate()

    val data: DataFrame = session.createDataFrame(Seq(
        ("a", Vectors.dense(1.0, 2.0, 3.0)),
        ("b", Vectors.dense(4.0, 5.0, 6.0))
      )).toDF("id", "vector")

    /** 权重向量 */
    val vector: linalg.Vector = Vectors.dense(0.0, 1.0, 2.0)

    val product: ElementwiseProduct = new ElementwiseProduct()
      .setInputCol("vector")
      .setOutputCol("transform_vector")
      .setScalingVec(vector)

    val res: DataFrame = product.transform(data)
    res.show(false)
  }
}
